package com.cskaoyan.javase.object._1getclass;

/**
 * @description: getClass方法
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 方法的声明:
 *      public final native Class<?> getClass();
 * public表示访问权限是公共的,不需要考虑权限问题'
 * final表示不可被覆盖的方法
 * native表示该方法是一个本地方法,一般是C/C++代码实现,不是Java代码实现功能的方法,所以它没有方法
 *      它的调用使用本地方法栈内存,而不是JVM栈
 * Class<?> 返回值类型一个Class类,表示该方法返回Class对象
 *      <?>表示泛型,关于泛型不是一个必须要填写的语法,集合中再学习泛型,这里我们直接省略掉
 * getClass()表示方法不需要参数,是一个无参的方法,并且被Java所有的类继承,都可以调用该方法
 *
 * 方法的作用:
 *      该方法的作用是返回Class对象,而Class对象是该对象的运行时类Class对象
 * 为了能够让程序员也能够在程序运行期间了解一个类型,在类加载过程中,会自动在内存中(堆上)创建一个属于该类型的Class对象
 * 也称之为该类型的运行时对象
 * 运行时对象当中,包含了这个类型的所有类型信息,比如有哪些方法,都叫啥,有哪些构造器等等
 *
 * getClass方法的注意事项:
 *      1.Class对象是在类加载过程中自动创建的,和getClass方法没有关系,该方法只不过是获取了该对象
 *      2.Class对象是类加载过程中创建的,相同类型的类加载只有一次,所以相同类型的Class对象也只有一个
 *          不同类型类加载不同,Class对象肯定不同(根据这一特点,可以用来判断两个引用指向的对象是否是同一个类型的对象)
 *      3.Class对象当中装有类型信息,所以根据这一点很多人把它叫做"类对象",要和"类的对象"做区分
 *          类对象: Class对象,每个类型独一份
 *          类的对象: new出来的对象,想创建几个就有几个
 *
 *
 * Class对象的使用,实质上就对象Java中的高级特性,反射
 *      反射实际上就是使用Class API,获取类型信息,就可以创建对象,甚至还可以破解私有权限("为所欲为")
 *      Class对象是反射的基础,而反射又是Java中框架的基础
 *
 * Class类常用的两个方法:
 *      getName: 获取该类型的全限定类名
 *      getSimpleName: 获取该类型的类名,不包括包名
 *
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student(18);
        Student s2 = new Student(28);
        Class stuClazz = s.getClass();
        Class stuClazz2 = s2.getClass();
        //"=="比较引用数据类型的引用,比较的是地址,实际上只有两个引用指向同一个对象才会返回true
        System.out.println(s == s2); //false
        System.out.println(stuClazz == stuClazz2); //true

        System.out.println(stuClazz.getName());


        Teacher t = new Teacher();
        Class teacherClazz = t.getClass();
        System.out.println(stuClazz == teacherClazz); //false
        System.out.println(teacherClazz.getSimpleName());

    }
}

class Student {
    int age;

    public Student() {
    }

    public Student(int age) {
        this.age = age;
    }
}

class Teacher {

}
